import 'dart:io';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:get/get.dart';
import 'package:leader_help/global/global.dart';
import 'package:leader_help/global/user/logic.dart';

import '../methodchannelmanager.dart';

/// @Author : 王亚东

/// @Time : On 2021/12/21 9:43

class TopDioIntercepter extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    // Do something before request is sent

    Map map = options.method == 'GET' ? options.queryParameters : options.data;

    String ctimestamp =
        (DateTime.now().millisecondsSinceEpoch / 1000).toInt().toString();
    String papams = '';
    String cnonce = randomString(6);
    if (map.length > 0) {
      papams = map.values.toList()[0].toString();
    }

    String cData = '${papams}-POST-${ctimestamp}-${cnonce}';

    // SM3Digest().
    // StreamCipher('SM3')
    final userCtrl = Get.find<UserController>();
    var user = userCtrl.state.user;
    MethodChannelManager.platform
        .invokeMethod('sm3EncryptText', cData)
        .then((csign) {
      options.headers = {
        "appCode": "jx-clivil-servant-assessment",
        "userId": user?.id ?? '',
        "token": GlobalState().token ?? '',
        "userName": user?.name != null
            ? Uri.encodeComponent(user!.name.toString())
            : '',
        "organId": user?.orgId ?? '',
        "tenantId": user?.tenantId ?? '',
        "type": 1,
        "ctimestamp": ctimestamp,
        "cnonce": cnonce,
        "csign": csign
      };

      print('---header---' + options.headers.toString());
      return handler.next(options); //continue
    });

    // 如果你想完成请求并返回一些自定义数据，你可以resolve一个Response对象 `handler.resolve(response)`。
    // 这样请求将会被终止，上层then会被调用，then中返回的数据将是你的自定义response.
    //
    // 如果你想终止请求并触发一个错误,你可以返回一个`DioError`对象,如`handler.reject(error)`，
    // 这样请求将被中止并触发异常，上层catchError会被调用。
  }

  String randomString(int len) {
    String charsAll = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
    var maxPos = charsAll.length;
    var pwd = '';
    for (int i = 0; i < len; i++) {
      pwd += charsAll[Random().nextInt(maxPos)];
    }
    return pwd;
  }
}
